{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM——皮马印第安人糖尿病分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn import metrics\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "#dpath = './data/'\n",
    "#train = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "train = pd.read_csv(\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEKCAYAAAAIO8L1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAE45JREFUeJzt3X20ZXV93/H3BwY0RcLwMLIIw2Sw\nmWSFVRVxpKiND2hb0ZZBKnmoK0zNrE5c9QEXaQqmqZjYGk00WpuGdFagQptIkIqMSqJkBGxMIQyK\nyIMuRorMZCwz8oxULPLtH+d34TjsuXfPwL7ncO/7tdZZZ+/f/u1zvnet4XzY+7f3b6eqkCRpV/tM\nugBJ0nQyICRJnQwISVInA0KS1MmAkCR1MiAkSZ0MCElSJwNCktTJgJAkdVoy6QKeisMOO6xWrlw5\n6TIk6Rnl+uuv/25VLZur3zM6IFauXMnmzZsnXYYkPaMk+Xaffp5ikiR1MiAkSZ0MCElSJwNCktTJ\ngJAkdRo0IJLckeTrSW5Isrm1HZLkiiS3tfeDW3uSfCzJliQ3JjluyNokSbObjyOIV1fVsVW1uq2f\nDWyqqlXAprYOcBKwqr3WA+fOQ22SpN2YxCmmNcAFbfkC4JSx9gtr5BpgaZIjJlCfJInhA6KALyS5\nPsn61nZ4VX0HoL0/t7UfCWwd23dba5MkTcDQd1K/vKq2J3kucEWSb8zSNx1t9aROo6BZD7BixYqn\nXOCLf/3Cp/wZWniu/73TJ12CNHGDHkFU1fb2vgO4FDgeuGvm1FF739G6bwOOGtt9ObC94zM3VNXq\nqlq9bNmcU4lIkvbSYAGR5IAkB84sA/8IuAnYCKxt3dYCl7XljcDp7WqmE4D7Z05FSZLm35CnmA4H\nLk0y8z1/WlV/keQ64OIk64A7gdNa/8uB1wNbgIeBtwxYmyRpDoMFRFXdDrywo/1u4DUd7QW8bah6\nJEl7xjupJUmdDAhJUicDQpLUyYCQJHUyICRJnQwISVInA0KS1MmAkCR1MiAkSZ0MCElSJwNCktTJ\ngJAkdTIgJEmdDAhJUicDQpLUyYCQJHUyICRJnQwISVInA0KS1MmAkCR1MiAkSZ0MCElSJwNCktTJ\ngJAkdTIgJEmdDAhJUicDQpLUyYCQJHUyICRJnQwISVInA0KS1MmAkCR1Gjwgkuyb5KtJPtvWj05y\nbZLbkvxZkv1b+7Pa+pa2feXQtUmSdm8+jiDOAG4dW/8g8JGqWgXcC6xr7euAe6vqp4CPtH6SpAkZ\nNCCSLAfeAPxxWw9wInBJ63IBcEpbXtPWadtf0/pLkiZg6COIjwL/BnisrR8K3FdVj7b1bcCRbflI\nYCtA235/6y9JmoA5AyLJAUn2acs/neTkJPv12O+fADuq6vrx5o6u1WPb+OeuT7I5yeadO3fOVYYk\naS/1OYL4EvDsJEcCm4C3AB/vsd/LgZOT3AFcxOjU0keBpUmWtD7Lge1teRtwFEDbfhBwz64fWlUb\nqmp1Va1etmxZjzIkSXujT0Ckqh4GTgX+U1W9EThmrp2q6t1VtbyqVgK/CHyxqt4MXAm8qXVbC1zW\nlje2ddr2L1bVk44gJEnzo1dAJHkp8Gbgc61tySz953IWcGaSLYzGGM5r7ecBh7b2M4Gzn8J3SJKe\noj4/9O8C3g1cWlU3J3keo6OA3qrqKuCqtnw7cHxHn+8Dp+3J50qShjNnQFTV1cDVSQ5o67cD7xy6\nMEnSZPW5iumlSW6h3eyW5IVJ/nDwyiRJE9VnDOKjwD8G7gaoqq8BrxiyKEnS5PW6Ua6qtu7S9MMB\napEkTZE+g9Rbk7wMqDax3jv50bmVJEkLUJ8jiLcCb2M0FcY24Ni2LklawPpcxfRdRvdASJIWkT5X\nMV2QZOnY+sFJzh+2LEnSpPU5xfSCqrpvZqWq7gVeNFxJkqRp0Ccg9kly8MxKkkN4alNtSJKeAfr8\n0H8Y+OskMw/5OQ34D8OVJEmaBn0GqS9Mcj3wakbPbDi1qm4ZvDJJ0kT1PVX0DUbPj14CkGRFVd05\nWFWSpImbMyCSvAM4B7iL0R3UYfSktxcMW5okaZL6HEGcAfxMVd09dDGSpOnR5yqmrcD9QxciSZou\nfY4gbgeuSvI54JGZxqr6/cGqkiRNXJ+AuLO99m8vSdIi0Ocy198CSHJAVX1v+JIkSdPAJ8pJkjr5\nRDlJUiefKCdJ6uQT5SRJnXyinCSp06xHEEn2BX65qnyinCQtMrMeQVTVD4E181SLJGmK9BmD+HKS\nPwD+DHj8Poiq+spgVUmSJq5PQLysvf/2WFsBJz795UiSpsVcYxD7AOdW1cXzVI8kaUrMNQbxGPD2\neapFkjRF+lzmekWSf53kqCSHzLwGr0ySNFF9xiB+pb2P3/tQwPOe/nIkSdOiz2yuR89HIZKk6dLn\nmdSnd7VX1YVz7Pds4EvAs9r3XFJV5yQ5GrgIOAT4CqMb8X6Q5FnAhcCLGU0M+AtVdcce/C2SpKdR\nnzGIl4y9fg54L3Byj/0eAU6sqhcymp7jdUlOAD4IfKSqVgH3Auta/3XAvVX1U8BHWj9J0oT0OcX0\njvH1JAcB/63HfgU81Fb3a6+Z+yf+eWu/gFHgnMvoju33tvZLgD9IkvY5kqR51mu67108DKzq0zHJ\nvkluAHYAVwDfAu6rqkdbl22MJgGkvW8FaNvvBw7di/okSU+DPmMQn2H0f/4wCpRjgF43zrW5nI5N\nshS4FPjZrm4zXzXLtvF61gPrAVasWNGnDEnSXuhzmeuHxpYfBb5dVdv25Euq6r4kVwEnAEuTLGlH\nCcuB7a3bNuAoYFuSJcBBwD0dn7UB2ACwevVqTz9J0kD6nGK6E7i2qq6uqi8DdydZOddOSZa1IweS\n/BjwWkYPGroSeFPrtha4rC1vbOu07V90/EGSJqdPQHwSeGxs/YetbS5HAFcmuRG4Driiqj4LnAWc\nmWQLozGG81r/84BDW/uZwNn9/gRJ0hD6nGJaUlU/mFlp9yzsP9dOVXUj8KKO9tuB4zvavw+c1qMe\nSdI86HMEsTPJ4/c9JFkDfHe4kiRJ06DPEcRbgT9pDw2C0WBy593VkqSFo8+Nct8CTkjyHCBV9eDw\nZUmSJm3OU0xJ3p9kaVU9VFUPJjk4yb+fj+IkSZPTZwzipKq6b2alqu4FXj9cSZKkadAnIPZtM60C\nj9/T8KxZ+kuSFoA+g9T/HdiU5L8ymvriVxhNsidJWsD6DFL/brvZ7bWt6X1V9flhy5IkTVqfIwiA\nr/LEdN1fHa4cSTPu/O3nT7oETaEV7/n6vH1Xn6uYfh74G0bzI/08cG2SN82+lyTpma7PEcS/BV5S\nVTtgNAkf8JeMHuojSVqg+lzFtM9MODR399xPkvQM1ucI4i+SfB74RFv/BeDy4UqSJE2DPlcx/XqS\nU4F/wOipbxuq6tLBK5MkTVSvq5iq6lPApwauRZI0RRxLkCR1MiAkSZ12GxBJNrX3D85fOZKkaTHb\nGMQRSV4JnJzkIkYD1I+rqq8MWpkkaaJmC4j3AGcDy4Hf32VbAScOVZQkafJ2GxBVdQlwSZJ/V1Xv\nm8eaJElToM99EO9LcjLwitZ0VVV9dtiyJEmT1meyvt8BzgBuaa8zWpskaQHrc6PcG4Bjq+oxgCQX\nMJry+91DFiZJmqy+90EsHVs+aIhCJEnTpc8RxO8AX01yJaNLXV+BRw+StOD1GaT+RJKrgJcwCoiz\nqur/DF2YJGmy+k7W9x1g48C1SJKmiHMxSZI6GRCSpE6zBkSSfZLcNF/FSJKmx6wB0e59+FqSFfNU\njyRpSvQ5xXQEcHOSTUk2zrzm2inJUUmuTHJrkpuTnNHaD0lyRZLb2vvBrT1JPpZkS5Ibkxz31P40\nSdJT0ecqpt/ay89+FPi1qvpKkgOB65NcAfwLYFNVfSDJ2YxmjD0LOAlY1V5/Hzi3vUuSJmDOI4iq\nuhq4A9ivLV8HzPksiKr6zswzI6rqQeBW4EhgDXBB63YBcEpbXgNcWCPXAEuTHLFnf44k6enSZ7K+\nfwlcAvyX1nQk8Ok9+ZIkK4EXAdcCh7f7Kmbur3ju2OduHdttW2uTJE1AnzGItwEvBx4AqKrbeOJH\nfU5JngP8D+BdVfXAbF072qrj89Yn2Zxk886dO/uWIUnaQ30C4pGq+sHMSpIldPxwd0myH6Nw+JOq\n+lRrvmvm1FF739HatwFHje2+HNi+62dW1YaqWl1Vq5ctW9anDEnSXugTEFcn+Q3gx5L8Q+CTwGfm\n2ilJgPOAW6tq/JGlG4G1bXktcNlY++ntaqYTgPtnTkVJkuZfn6uYzgbWAV8HfhW4HPjjHvu9HPhl\n4OtJbmhtvwF8ALg4yTrgTuC0tu1y4PXAFuBh4C09/wZJ0gD6zOb6WHtI0LWMTi19s6rmPMVUVX9F\n97gCwGs6+hej8Q5J0hSYMyCSvAH4I+BbjH7wj07yq1X150MXJ0manD6nmD4MvLqqtgAk+bvA5wAD\nQpIWsD6D1DtmwqG5nSeuPJIkLVC7PYJIcmpbvDnJ5cDFjMYgTmN0N7UkaQGb7RTTPx1bvgt4ZVve\nCRw8WEWSpKmw24CoKi8zlaRFrM9VTEcD7wBWjvevqpOHK0uSNGl9rmL6NKM7oj8DPDZsOZKkadEn\nIL5fVR8bvBJJ0lTpExD/Mck5wBeAR2YaZ571IElamPoExPMZzal0Ik+cYqq2LklaoPoExBuB541P\n+S1JWvj63En9NWDp0IVIkqZLnyOIw4FvJLmOHx2D8DJXSVrA+gTEOYNXIUmaOn2eB3H1fBQiSZou\nfe6kfpAnnkG9P7Af8L2q+vEhC5MkTVafI4gDx9eTnAIcP1hFkqSp0Ocqph9RVZ/GeyAkacHrc4rp\n1LHVfYDVPHHKSZK0QPW5imn8uRCPAncAawapRpI0NfqMQfhcCElahGZ75Oh7Ztmvqup9A9QjSZoS\nsx1BfK+j7QBgHXAoYEBI0gI22yNHPzyznORA4AzgLcBFwId3t58kaWGYdQwiySHAmcCbgQuA46rq\n3vkoTJI0WbONQfwecCqwAXh+VT00b1VJkiZuthvlfg34CeA3ge1JHmivB5M8MD/lSZImZbYxiD2+\ny1qStHAYApKkTgaEJKmTASFJ6mRASJI6DRYQSc5PsiPJTWNthyS5Islt7f3g1p4kH0uyJcmNSY4b\nqi5JUj9DHkF8HHjdLm1nA5uqahWwqa0DnASsaq/1wLkD1iVJ6mGwgKiqLwH37NK8htEd2bT3U8ba\nL6yRa4ClSY4YqjZJ0tzmewzi8Kr6DkB7f25rPxLYOtZvW2t7kiTrk2xOsnnnzp2DFitJi9m0DFKn\no63zqXVVtaGqVlfV6mXLlg1cliQtXvMdEHfNnDpq7zta+zbgqLF+y4Ht81ybJGnMfAfERmBtW14L\nXDbWfnq7mukE4P6ZU1GSpMno80zqvZLkE8CrgMOSbAPOAT4AXJxkHXAncFrrfjnwemAL8DCj505I\nkiZosICoql/azabXdPQt4G1D1SJJ2nPTMkgtSZoyBoQkqZMBIUnqZEBIkjoZEJKkTgaEJKmTASFJ\n6mRASJI6GRCSpE4GhCSpkwEhSepkQEiSOhkQkqROBoQkqZMBIUnqZEBIkjoZEJKkTgaEJKmTASFJ\n6mRASJI6GRCSpE4GhCSpkwEhSepkQEiSOhkQkqROBoQkqZMBIUnqZEBIkjoZEJKkTgaEJKmTASFJ\n6mRASJI6TVVAJHldkm8m2ZLk7EnXI0mL2dQERJJ9gf8MnAQcA/xSkmMmW5UkLV5TExDA8cCWqrq9\nqn4AXASsmXBNkrRoTVNAHAlsHVvf1tokSROwZNIFjElHWz2pU7IeWN9WH0ryzUGrWlwOA7476SKm\nQT60dtIl6Ef5b3PGOV0/lXvsJ/t0mqaA2AYcNba+HNi+a6eq2gBsmK+iFpMkm6tq9aTrkHblv83J\nmKZTTNcBq5IcnWR/4BeBjROuSZIWrak5gqiqR5O8Hfg8sC9wflXdPOGyJGnRmpqAAKiqy4HLJ13H\nIuapO00r/21OQKqeNA4sSdJUjUFIkqaIASGnONHUSnJ+kh1Jbpp0LYuRAbHIOcWJptzHgddNuojF\nyoCQU5xoalXVl4B7Jl3HYmVAyClOJHUyINRrihNJi48BoV5TnEhafAwIOcWJpE4GxCJXVY8CM1Oc\n3Apc7BQnmhZJPgH8L+BnkmxLsm7SNS0m3kktSerkEYQkqZMBIUnqZEBIkjoZEJKkTgaEJKmTASHt\nRpKlSf7VPHzPq5K8bOjvkfaUASHt3lKgd0BkZG/+m3oVYEBo6ngfhLQbSWZmtv0mcCXwAuBgYD/g\nN6vqsiQrgT9v218KnAK8FjiL0ZQltwGPVNXbkywD/ghY0b7iXcDfAtcAPwR2Au+oqv85H3+fNBcD\nQtqN9uP/2ar6e0mWAH+nqh5IchijH/VVwE8CtwMvq6prkvwE8NfAccCDwBeBr7WA+FPgD6vqr5Ks\nAD5fVT+b5L3AQ1X1ofn+G6XZLJl0AdIzRID3J3kF8BijKdEPb9u+XVXXtOXjgaur6h6AJJ8Efrpt\ney1wTPL4BLo/nuTA+She2hsGhNTPm4FlwIur6v8luQN4dtv2vbF+XdOnz9gHeGlV/d/xxrHAkKaK\ng9TS7j0IzPwf/kHAjhYOr2Z0aqnL3wCvTHJwOy31z8a2fYHRxIgAJDm243ukqWFASLtRVXcDX05y\nE3AssDrJZkZHE9/YzT5/C7wfuBb4S+AW4P62+Z3tM25Mcgvw1tb+GeCNSW5I8nOD/UHSHnKQWnqa\nJXlOVT3UjiAuBc6vqksnXZe0pzyCkJ5+701yA3AT8L+BT0+4HmmveAQhSerkEYQkqZMBIUnqZEBI\nkjoZEJKkTgaEJKmTASFJ6vT/AUeMG8jkWPD8AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('target');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y = train['Outcome'].values\n",
    "X = train.drop('Outcome', axis = 1)\n",
    "\n",
    "#用于后续显示权重系数对应的特征\n",
    "columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(614, 8)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=22, test_size=0.2)\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.82      0.90      0.86        80\n",
      "          1       0.77      0.63      0.69        43\n",
      "\n",
      "avg / total       0.80      0.80      0.80       123\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[72  8]\n",
      " [16 27]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优\n",
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1）\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7886178861788617\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.6829268292682927\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6747967479674797\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "RBF核是SVM最常用的核函数。 RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma C越小，决策边界越平滑； gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8292682926829268\n",
      "accuracy: 0.975609756097561\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.8699186991869918\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.9512195121951219\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.8373983739837398\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.943089430894309\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.983739837398374\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-1, 3, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-1, 3, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nXzp27Cht27aVv/3tb3Lq1CkREXnsscekZcuW0rp1a3n88cdl2bJl4u/vLyEhIRIZGSn79u0r9nEL\nJ4tZs2ZJq1atJCIiQsaPH+9s8+6770qzZs2kR48eMnLkSGfV2R9++EFGjhzpbLdy5Upp3bq1dOrU\nSR577DFn1dndu3dL165dJSoqSqKjo52VTxcuXCg9e/aUm2++WZo2bSpPPfWUzJw5U2JjY6V169bO\n93HbbbfJ2LFjpWfPntK4cWNZunSp3HHHHdKiRQu5++67nccfPXq0xMTESHh4uLN6rYhIfn6+hISE\nFElqeXl5F0wWc+fOlREjRpxzX4MGDZxf9oU98sgjzi/xwjZu3Cg9evQ452u1bdv2nP9e06ZNc36J\nF5acnCxNmjQ552vdeOONsmTJkrO2X857Kaxdu3ayePHiC7Y57UqShRYSvAT73n6bul7Q5an3rA6l\n0nhlzStsT7n00zcXElYrjCfaP3FFr3H06FEmT57ML7/8go+PDy+99BLTpk1j5MiRzJ8/ny1btmCM\ncRaFu+666xgyZEiRQnCXIjExkaeffpq4uDj8/Pzo06cP33//PZGRkUyePJn169dTrVo1evbs6SxM\n+PvvvxMTE+N8jbvuuouZM2fSvn17HnvsMef2+vXrs3DhQry8vNi+fTsjRoxw3tNi48aNbNu2DT8/\nP0JCQhg7dixr165l6tSpvPXWW7z2mn01YFpaGkuWLOGrr75i4MCBrFy5krCwMKKjo9m8eTOtWrVi\n8uTJ1KpVi/z8fOd9MsLDw3F3dyckJITNmzcTGRlZrM9j586diAh9+/bl+PHj3HbbbTz66KMcP34c\nDw8Pxo8fz7Jly2jWrBlvvfUWderUYefOnVStWpUuXbpQUFDACy+8QN++fdm5cyc1atTghhtuID4+\nnr59+zJp0iTc3NzYt28fn332Gd9++y1169blzTffpEmTJuzcuRNjDD169CAjI4OHH36Y22+/nb17\n91KnTh3uuOMONm3aRLt27XjjjTfw8fFh586d/PrrrzzxxBN4e3szdepUYmJiLuu9nLZ3714OHjxI\njx49Luv/q0uhhQSLadM3Uwndlcexng3xa9DC6nCUxbREuWtKlBdXfn4+v//+O7Nnz2b58uX897//\nZenSpeTn57N//3569erF+vXriYmJ4fHHH3f22bt3L0uXLuWzzz7j7rvv5uTJk+Tn57N8+XLeeOMN\n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\nmJlZoc8Acgyz7feCRs4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
